package com.ruoyi.web.controller.pay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.internal.util.AlipaySignature;
import com.ruoyi.pay.service.AliPayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Map;

@CrossOrigin
@RestController
@Slf4j
@RequestMapping("/pay/notify")
@Api(tags = "支付宝支付异步通知")
public class NotifyController {

    @Resource
    private AliPayService aliPayService;

    @Resource
    private Environment environment;

    @PostMapping("/trade")
    @ApiOperation("支付成功异步通知接口")
    public String tradePayNotify(@RequestParam Map<String,String> params) {
        log.info("异步通知参数===> {}",params);

        String result = "failure";
        try {
            // 异步通知验签
            aliPayService.SignatureVerification(params);

            // TODO 二次校验
            /**
             * 二次校验
             *
             * 按照支付结果异步通知中的描述，进行严格的二次校验
             * 1. 判断订单号out_trade_no 是否为商户生成的订单号
             * 2. 判断商品价格total_amount 是否为商户传入的订单金额
             * 3. 判断商户编号seller_id 是否为商户在支付宝开发平台中申请的商户编号
             * 4. 验证应用编号app_id是否为支付宝发给当前商户的唯一标识
             *
             * 注意：trade_status判断是否支付成功，如果支付成功，此时trade_status为TRADE_SUCCESS或TRADE_FINISHED
             * 如果支付失败，此时trade_status为TRADE_CLOSED
             */
            aliPayService.paramsSinspect(params);

            // TODO 处理订单业务
            aliPayService.processOrder(params);

            result = "success";

            return result;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
